19  River 4 (IS) - CJS model

Simple CJS models to get phi and p estimates to compare with Neural Network CMR

In all the models below, 1 = not observed and 2 = observed in the input encounter data.
Encounter data are available here in the eh.csv file.

19.1 [t,t] model

Model with phi and p for each age-in-samples (column in the encounter history file)

Probability of survival (phi) model structure:

phi[t] <- betaInt[t]

Probability of capture (p) model structure:

p[t] <- betaP[t]

Model code is in ./models/cmrNN_OB/tt/modelCMR_tt_NN_OB_functionsToSource.R
Model is run ‘by hand’ in ./models/cmrNN_OB/tt/modelCMR_tt_NN_OB_makeFile.R
Not using this: Targets are loaded in R/modelCMR_tt_NN_OB.R and saved as modelCMR_tt_NN_OB_target

Model runs:
tt_NN_OB_2023-06-14 23.RData: preliminary run only tracing phi and p
tt_NN_OB_2023-06-15 08.RData: tracing phi and p and z [most recent]

19.1.1 Retrieve model results

Code
# Following https://oliviergimenez.github.io/bayesian-cr-workshop/worksheets/4_demo.html
# 
  load('./models/cmrNN_OB/tt/runsOut/tt_NN_OB_mostRecent.RData')
  out_NN_OB <- d
  
  #Input data
  eh <- tar_read(eh_OB_2002_2014_target)

19.1.2 Model code

In the model code, a value of 1 for z or in gamma or omega signifies the individual is alive and a value of 2 signifies the individual is dead. y[i,j] is the observed data (encounter history file).

Code
  out_NN_OB$modelCode
{
    delta[1] <- 1
    delta[2] <- 0
    for (t in 1:(T - 1)) {
        phi[t] ~ dunif(0, 1)
        gamma[1, 1, t] <- phi[t]
        gamma[1, 2, t] <- 1 - phi[t]
        gamma[2, 1, t] <- 0
        gamma[2, 2, t] <- 1
        p[t] ~ dunif(0, 1)
        omega[1, 1, t] <- 1 - p[t]
        omega[1, 2, t] <- p[t]
        omega[2, 1, t] <- 1
        omega[2, 2, t] <- 0
    }
    for (i in 1:N) {
        z[i, first[i]] ~ dcat(delta[1:2])
        for (j in first[i]:(last[i] - 1)) {
            z[i, j + 1] ~ dcat(gamma[z[i, j], 1:2, j])
            y[i, j + 1] ~ dcat(omega[z[i, j + 1], 1:2, j])
        }
    }
}

19.1.3 Model statistics

Run statistics
nIter nBurnin nChains thinRate
5000 2000 2 5

[1] “Run time = 33.374 mins”

19.1.4 Plot traces

Code
  priors <- runif(out_NN_OB$runData$nIter * out_NN_OB$runData$nChains, 0, 1)
  MCMCtrace(object = out_NN_OB$mcmc,
            #ISB = FALSE,
            #exact = TRUE, 
            params = c("phi", "p"),
            pdf = FALSE, 
            priors = priors)

19.1.5 Summary data

Code
  MCMCplot(object = out_NN_OB$mcmc, params = c("phi"))

Code
  MCMCplot(object = out_NN_OB$mcmc, params = c("p"))

Summary values

Code
#|
  (summary_tt <- MCMCsummary(object = out_NN_OB$mcmc, params = c("phi", "p"), round = 3) %>%
    rownames_to_column(var = "var"))
       var  mean    sd  2.5%   50% 97.5% Rhat n.eff
1   phi[1] 0.812 0.022 0.769 0.812 0.854 1.01   290
2   phi[2] 0.810 0.025 0.762 0.811 0.859 1.00   218
3   phi[3] 0.749 0.021 0.708 0.749 0.792 1.01   230
4   phi[4] 0.647 0.021 0.606 0.647 0.689 1.00   361
5   phi[5] 0.640 0.026 0.587 0.640 0.687 1.00   258
6   phi[6] 0.691 0.035 0.629 0.690 0.764 1.05   206
7   phi[7] 0.830 0.051 0.736 0.827 0.932 1.02   100
8   phi[8] 0.330 0.032 0.271 0.330 0.393 1.00   312
9   phi[9] 0.669 0.079 0.528 0.665 0.837 1.01   200
10 phi[10] 0.560 0.090 0.401 0.556 0.754 1.08   188
11 phi[11] 0.684 0.151 0.412 0.679 0.958 1.00   103
12    p[1] 0.597 0.022 0.555 0.597 0.638 1.00   449
13    p[2] 0.448 0.019 0.410 0.447 0.487 1.01   512
14    p[3] 0.707 0.020 0.669 0.707 0.746 1.00   441
15    p[4] 0.659 0.022 0.615 0.659 0.701 1.01   452
16    p[5] 0.634 0.025 0.587 0.634 0.682 1.01   457
17    p[6] 0.499 0.028 0.447 0.500 0.554 1.01   380
18    p[7] 0.701 0.041 0.616 0.701 0.780 1.00   156
19    p[8] 0.783 0.048 0.682 0.788 0.869 1.00   401
20    p[9] 0.605 0.072 0.458 0.608 0.736 1.03   325
21   p[10] 0.692 0.088 0.512 0.695 0.849 1.03   312
22   p[11] 0.733 0.155 0.438 0.727 0.989 1.00   123
Code
  # To get the mMCMCSummaryRMNA funcion which I adapted to deal with NAs
  source('./models/cmrNN_OB/tt/modelCMR_tt_NN_OB_functionsToSource.R')
  
  summary_tt_z0 <- MCMCSummaryRMNA(object = out_NN_OB$mcmc, params = c("z"), round = 3) %>%
    rownames_to_column(var = "var") |> 
    mutate(
      ind0 = str_match(var, "([0-9]+), ([0-9]+)")[,2],
      t0 =   str_match(var, "([0-9]+), ([0-9]+)")[,3],
      ind = as.numeric(ind0),
      t = as.numeric(t0)
    ) |> 
    dplyr::select(-c(t0, ind0))

Add other variables to summary values

Code
  ehLong <- 
    eh$eh |>
    as.data.frame() |> 
    rownames_to_column("ind0") |> 
    pivot_longer(starts_with("ais")) |> 
    mutate(
      t = as.numeric(str_match(name, "([0-9]+)")[,1]),
      enc = value,
      ind = as.numeric(ind0)
    ) |> 
    dplyr::select(-c(name, value, ind0))
  
  firstLong <- eh$first |> 
    as_tibble() |> 
    rownames_to_column("ind") |> 
    mutate(ind = as.numeric(ind)) |> 
    rename(first = value)
  
  lastLong <- eh$last |> 
    as_tibble() |> 
    rownames_to_column("ind") |> 
    mutate(ind = as.numeric(ind)) |> 
    rename(last = value)
    
  cohortLong <- eh$cohort |> 
    as_tibble() |> 
    rownames_to_column("ind") |> 
    mutate(ind = as.numeric(ind)) 
  
  summary_tt_z <- summary_tt_z0 |> 
    left_join(ehLong) |> 
    mutate(
      meanM1 = mean - 1,
      pSurv = ifelse(meanM1 == 0, 1, 1 - meanM1),
      enc8 = ifelse(enc == 1, 0.8, 0)
    ) |> 
    left_join(firstLong) |> 
    left_join(lastLong) |> 
    left_join(cohortLong)
Code
ojs_define(numTags_tt_OJS = dim(eh$tags)[1])
ojs_define(summary_tt_z_OJS = (summary_tt_z))

19.1.6 Plot the probability of survival (z) for selected individuals

Select one or more individuals :

Code
viewof selectInd_tt = Inputs.select([...Array(numTags_tt_OJS).keys()], {
  label: "Which fish?",
  value: 1,
  step: 1,
  multiple: true
})

summary_tt_z_OJS_T = transpose(summary_tt_z_OJS)
summary_tt_z_OJS_T_selected = summary_tt_z_OJS_T.filter((d) =>
  selectInd_tt.includes(d.ind)
)

Black dots/line is estimated probability of survival and orange dots are encountered yes (y = 0.8)/no (y = 0). The green line is the first observation and the red line is the last possible observation. The number in the upper right corner of each panel is the fish’s cohort.

Code
Plot.plot({
  width: width,
  height: 350,
  inset: 10,
  color: {
    scheme: "greys"
  },
  x: { label: "Age/season combination" },
  y: { label: "Probability of survival" },
  marks: [
    Plot.frame(),
    Plot.dot(summary_tt_z_OJS_T_selected, {
      x: "t",
      y: "pSurv"
    }),
    Plot.dot(summary_tt_z_OJS_T_selected, {
      x: "t",
      y: "enc8",
      fill: "orange"
    }),
    Plot.line(summary_tt_z_OJS_T_selected, {
      x: "t",
      y: "pSurv"
    }),
    Plot.ruleX(summary_tt_z_OJS_T_selected, {
      x: "first",
      y: 1,
      stroke: "green"
    }),
    Plot.ruleX(summary_tt_z_OJS_T_selected, {
      x: "last",
      y: 1,
      stroke: "red"
    })
    ,
    Plot.text(summary_tt_z_OJS_T_selected, 
      Plot.selectFirst({
        x: 11,
        y: 1,
        text: d => d.cohort
      })
    )
  ],
  facet: {
    data: summary_tt_z_OJS_T_selected,
    x: "ind"
  }
})

19.1.7 Output model summary data for Xiaowei

Code
  write.csv(summary_tt, './models/cmrNN_OB/tt/dataOut/xiaowei/summary_tt.csv')
  
  write.csv(summary_tt_z, './models/cmrNN_OB/tt/dataOut/xiaowei/summary_tt_z.csv')
  
  # #Output input data to Xiaowei directory. Turn to TRUE to output.
  # Output happens here: C:/Users/bletcher/OneDrive - DOI/projects/wbBook_quarto_targets/modelsCMR_NN_OB_outputData.qmd
  # if(FALSE) {
  # 
  #   for (i in seq_along(eh)){
  #     write.csv(eh[[i]], file = paste0('./models/cmrNN_OB/tt/dataOut/xiaowei/', 
  #                                      names(eh)[i], 
  #                                      ".csv"), 
  #               row.names = F)
  #   }
  # }

19.2 [s,s] model

Model with phi and p for each season_isYOY (YOY = young-of-year, isYOY = juvenile or adult) combination. Season is hierarchical over time. There are no data for the isYOY = TRUE, season = 2 state.

Probability of survival (phi) model structure:

phi[yoy, s] <- betaInt[yoy, s]

Probability of capture (p) model structure:

p[yoy, s] <- betaP[yoy, s]

Model code is in ./models/cmrNN_OB/ss/modelCMR_ss_NN_OB_functionsToSource.R
Model is run ‘by hand’ in ./models/cmrNN_OB/ss/modelCMR_ss_NN_OB_makeFile.R

Model runs:

19.2.1 Retrieve Bayesian model results

Code
# Following https://oliviergimenez.github.io/bayesian-cr-workshop/worksheets/4_demo.html
#
  load('./models/cmrNN_OB/ss/runsOut/ss_NN_OB_mostRecent.RData')
  out_ss_NN_OB <- d

  #Input data
  eh <- tar_read(eh_OB_2002_2014_target)

19.2.2 Model code

In the model code, a value of 1 for z or in gamma or omega signifies the individual is alive and a value of 2 signifies the individual is dead. y[i,j] is the observed data (encounter history file). isYOY = 1 signifies YOY = TRUE (juvenile), and isYOY = 2 signifies YOY = FALSE (adult)

Code
out_ss_NN_OB$modelCode
{
    {
        delta[1] <- 1
        delta[2] <- 0
        for (i in 1:N) {
            for (t in first[i]:(last[i] - 1)) {
                gamma[1, 1, t, i] <- phi[i, t]
                gamma[1, 2, t, i] <- 1 - phi[i, t]
                gamma[2, 1, t, i] <- 0
                gamma[2, 2, t, i] <- 1
                omega[1, 1, t, i] <- 1 - p[i, t]
                omega[1, 2, t, i] <- p[i, t]
                omega[2, 1, t, i] <- 1
                omega[2, 2, t, i] <- 0
            }
        }
        for (i in 1:N) {
            for (t in first[i]:(last[i] - 1)) {
                logit(phi[i, t]) <- phiInt[isYOY_DATA[i, t], 
                  seasons[t]]
                logit(p[i, t]) <- pInt[isYOY_DATA[i, t], seasons[t]]
            }
        }
        for (yoy in 1:2) {
            for (s in 1:4) {
                phiInt[yoy, s] ~ T(dnorm(0, sd = 1/0.667), -3.5, 
                  3.5)
                pInt[yoy, s] ~ dunif(0, 1)
            }
        }
        for (i in 1:N) {
            z[i, first[i]] ~ dcat(delta[1:2])
            for (j in first[i]:(last[i] - 1)) {
                z[i, j + 1] ~ dcat(gamma[z[i, j], 1:2, j, i])
                yDATA[i, j + 1] ~ dcat(omega[z[i, j + 1], 1:2, 
                  j, i])
            }
        }
    }
}

19.2.3 Model statistics

Run statistics
nIter nBurnin nChains thinRate
5000 2000 2 5

[1] “Run time = 38.594 mins”

19.2.4 Plot traces

Code
  priors <- runif(out_ss_NN_OB$runData$nIter * out_ss_NN_OB$runData$nChains, 0, 1)
  MCMCtrace(object = out_ss_NN_OB$mcmc,
            #ISB = FALSE,
            #exact = TRUE,
            params = c("phiInt", "pInt"),
            pdf = FALSE,
            priors = priors)

19.2.5 Summary data

Code
#|
  MCMCplot(object = out_ss_NN_OB$mcmc, params = c("phiInt"))

Code
  MCMCplot(object = out_ss_NN_OB$mcmc, params = c("pInt"))

Summary values

Code
(summary_ss <- tar_read(summary_ss_target))
            var   mean    sd   2.5%   50% 97.5% Rhat n.eff   mean_01
1  phiInt[1, 1]  1.356 0.134  1.111 1.347 1.660 1.00   298 0.7951088
2  phiInt[2, 1]  1.204 0.197  0.851 1.191 1.645 1.01   282 0.7692356
3  phiInt[1, 2] -0.008 1.409 -2.749 0.006 2.660 1.00  1200 0.4980000
4  phiInt[2, 2]  0.299 0.073  0.162 0.297 0.441 1.05   327 0.5741980
5  phiInt[1, 3]  1.458 0.127  1.218 1.454 1.713 1.01   368 0.8112266
6  phiInt[2, 3]  0.586 0.098  0.412 0.583 0.795 1.05   363 0.6424468
7  phiInt[1, 4]  1.291 0.116  1.067 1.288 1.507 1.04   424 0.7843164
8  phiInt[2, 4]  0.737 0.133  0.497 0.730 1.005 1.01   298 0.6763395
9    pInt[1, 1]  0.773 0.093  0.585 0.774 0.958 1.02   402 0.6841695
10   pInt[2, 1]  0.929 0.060  0.785 0.945 0.997 1.04   591 0.7168724
11   pInt[1, 2]  0.498 0.290  0.031 0.484 0.974 1.00  1200 0.6219892
12   pInt[2, 2]  0.731 0.088  0.556 0.732 0.904 1.01   549 0.6750247
13   pInt[1, 3]  0.405 0.080  0.254 0.406 0.562 1.00   636 0.5998884
14   pInt[2, 3]  0.548 0.097  0.349 0.552 0.742 1.01   469 0.6336715
15   pInt[1, 4]  0.022 0.019  0.001 0.017 0.073 1.00   489 0.5054998
16   pInt[2, 4]  0.117 0.078  0.006 0.103 0.295 1.01   527 0.5292167
Code
summary_ss_z0 <- tar_read(summary_ss_z0_target)
summary_ss_phi0 <- tar_read(summary_ss_phi0_target)
summary_ss_p0 <- tar_read(summary_ss_p0_target)

  # (summary_ss <- MCMCsummary(object = out_ss_NN_OB$mcmc, params = c("phiInt", "pInt"), round = 3) %>%
  #   rownames_to_column(var = "var") |> 
  #    mutate(mean_01 = exp(mean)/(1+exp(mean))))
  # 
  # # To get the mMCMCSummaryRMNA function which I adapted to deal with NAs
  # source('./models/cmrNN_OB/ss/modelCMR_ss_NN_OB_functionsToSource.R')
  # 
  # summary_ss_z0 <- MCMCSummaryRMNA(object = out_ss_NN_OB$mcmc, params = c("z"), round = 3) %>%
  #   rownames_to_column(var = "var") |>
  #   mutate(
  #     ind0 = str_match(var, "([0-9]+), ([0-9]+)")[,2],
  #     t0 =   str_match(var, "([0-9]+), ([0-9]+)")[,3],
  #     ind = as.numeric(ind0),
  #     t = as.numeric(t0)
  #   ) |>
  #   dplyr::select(-c(t0, ind0))
  # 
  # # 'phi' has each individual, 'phiInt' does not
  # summary_ss_phi0 <- MCMCSummaryRMNA(object = out_ss_NN_OB$mcmc, params = c("phi"), round = 3) %>%
  #   rownames_to_column(var = "var") |>
  #   mutate(
  #     ind0 = str_match(var, "([0-9]+), ([0-9]+)")[,2],
  #     t0 =   str_match(var, "([0-9]+), ([0-9]+)")[,3],
  #     ind = as.numeric(ind0),
  #     t = as.numeric(t0)
  #   ) |>
  #   dplyr::select(-c(t0, ind0))
  # 
  # summary_ss_p0 <- MCMCSummaryRMNA(object = out_ss_NN_OB$mcmc, params = c("p"), round = 3) %>%
  #   rownames_to_column(var = "var") |>
  #   mutate(
  #     ind0 = str_match(var, "([0-9]+), ([0-9]+)")[,2],
  #     t0 =   str_match(var, "([0-9]+), ([0-9]+)")[,3],
  #     ind = as.numeric(ind0),
  #     t = as.numeric(t0)
  #   ) |>
  #   dplyr::select(-c(t0, ind0))

Add other variables to summary values

Code
  ehLong <- tar_read(ehLong_target)
  firstLong <-tar_read(firstLong_target)

  lastLong <- tar_read(lastLong_target)

  cohortLong <- tar_read(cohortLong_target)
  #### z
  summary_ss_z <- tar_read(summary_ss_z_target)
  
  ##### p
  summary_ss_p <- tar_read(summary_ss_p_target)
  
  #### phi
  summary_ss_phi <- tar_read(summary_ss_phi_target)


  # ehLong <-
  #   eh$eh |>
  #   as.data.frame() |>
  #   rownames_to_column("ind0") |>
  #   pivot_longer(starts_with("ais")) |>
  #   mutate(
  #     t = as.numeric(str_match(name, "([0-9]+)")[,1]),
  #     enc = value,
  #     ind = as.numeric(ind0)
  #   ) |>
  #   dplyr::select(-c(name, value, ind0))
  # 
  # firstLong <- eh$first |>
  #   as_tibble() |>
  #   rownames_to_column("ind") |>
  #   mutate(ind = as.numeric(ind)) |>
  #   rename(first = value)
  # 
  # lastLong <- eh$last |>
  #   as_tibble() |>
  #   rownames_to_column("ind") |>
  #   mutate(ind = as.numeric(ind)) |>
  #   rename(last = value)
  # 
  # cohortLong <- eh$cohort |>
  #   as_tibble() |>
  #   rownames_to_column("ind") |>
  #   mutate(ind = as.numeric(ind))
  # 
  # #### z
  # summary_ss_z <- summary_ss_z0 |>
  #   left_join(ehLong) |>
  #   mutate(
  #     meanM1 = mean - 1,
  #     pSurv = ifelse(meanM1 == 0, 1, 1 - meanM1),
  #     enc8 = ifelse(enc == 1, 0.8, 0)
  #   ) |>
  #   left_join(firstLong) |>
  #   left_join(lastLong) |>
  #   left_join(cohortLong)
  # 
  # ##### p
  # summary_ss_p <- summary_ss_p0 |>
  #   left_join(ehLong) |>
  #   mutate(
  #     meanM1 = mean - 1,
  #     pSurv = ifelse(meanM1 == 0, 1, 1 - meanM1),
  #     enc8 = ifelse(enc == 1, 0.2, 0)
  #   ) |>
  #   left_join(firstLong) |>
  #   left_join(lastLong) |>
  #   left_join(cohortLong)
  # 
  # #### phi
  # summary_ss_phi <- summary_ss_phi0 |>
  #   left_join(ehLong) |>
  #   mutate(
  #     meanM1 = mean - 1,
  #     pSurv = ifelse(meanM1 == 0, 1, 1 - meanM1),
  #     enc8 = ifelse(enc == 1, 0.2, 0)
  #   ) |>
  #   left_join(firstLong) |>
  #   left_join(lastLong) |>
  #   left_join(cohortLong)

19.2.6 Retrieve ML model results

ML model result are from Xioawei and Erhu at PITT

Code
if(!exists("np")) {
  np <-import("numpy")
}

xP0 <- np$load("./data/in/fromXioawei/p_est.npy")

xP <- xP0 |> 
  as.data.frame() |> 
  rowid_to_column("ind") |> 
  pivot_longer(cols = starts_with("V")) |> 
  separate_wider_delim(name, delim = "V", names = c("d", "t")) |> 
  dplyr::select(-d) |> 
  mutate(t = as.numeric(t)) |> 
  rename(xP = value)


xPhi0 <- np$load("./data/in/fromXioawei/phi_est.npy")

xPhi <- xPhi0 |> 
  as.data.frame() |> 
  rowid_to_column("ind") |> 
  pivot_longer(cols = starts_with("V")) |> 
  separate_wider_delim(name, delim = "V", names = c("d", "t")) |> 
  dplyr::select(-d) |> 
  mutate(t = as.numeric(t))|> 
  rename(xPhi = value)

Plot ML model results

Code
ggplot(xP, aes(t, xP)) +
  geom_point(alpha = 0.01)

Code
ggplot(xPhi, aes(t, xPhi)) +
  geom_point(alpha = 0.01)

Plot ML model results - jittered

Code
ggplot(xP, aes(t, xP)) +
  geom_jitter(alpha = 0.01)

Code
ggplot(xPhi, aes(t, xPhi)) +
  geom_jitter(alpha = 0.01)

Group by individual

Code
ggplot(xP, aes(t, xP, group = ind)) +
  geom_line()

Code
ggplot(xPhi, aes(t, xPhi, group = ind)) +
  geom_line()

19.2.7 Summarize ML model results

Code
summary_xPhi <- xPhi |> 
  summarize(
    meanPhi = mean(xPhi),
    sdPhi = sd(xPhi)
  )

summary_xP <- xP |> 
  summarize(
    meanP = mean(xP),
    sdP = sd(xP)
  )

19.2.8 Merge ML model results with Bayesian results

Code
summary_ss_phi_x <- summary_ss_phi |> 
  left_join(xPhi)

summary_ss_p_x <- summary_ss_p |> 
  left_join(xP)

Plot Bayes and ML model results for individual fish

Code
ggplot(summary_ss_phi_x, aes(mean, xPhi, color = factor(t))) +
  geom_jitter(alpha = 0.01)

Code
ggplot(summary_ss_p_x, aes(mean, xP, color = factor(t))) +
  geom_jitter(alpha = 0.01)

Observable interactivity

Code
ojs_define(numTags_ss_OJS = dim(eh$tags)[1])
ojs_define(summary_ss_z_OJS = (summary_ss_z))

ojs_define(summary_ss_phi_x_OJS = (summary_ss_phi_x))
ojs_define(summary_ss_p_x_OJS = (summary_ss_p_x))
Code
summary_ss_phi_x_OJS

19.2.9 Plot the probabilities for selected individuals

Probabilities are: alive (z), survival (phi), and detection (p)

Code
summary_ss_z_OJS_T_selected
Code
summary_ss_phi_x_OJS_T_selected
Code
summary_ss_p_x_OJS_T_selected
Code
viewof selectInd_ss = Inputs.select([...Array(numTags_ss_OJS).keys()], {
  label: "Which fish?",
  value: 1,
  step: 1,
  multiple: true
})

summary_ss_z_OJS_T = transpose(summary_ss_z_OJS)
summary_ss_z_OJS_T_selected = summary_ss_z_OJS_T.filter((d) =>
  selectInd_ss.includes(d.ind)
)

summary_ss_phi_x_OJS_T = transpose(summary_ss_phi_x_OJS)
summary_ss_phi_x_OJS_T_selected = summary_ss_phi_x_OJS_T.filter((d) =>
  selectInd_ss.includes(d.ind)
)

summary_ss_p_x_OJS_T = transpose(summary_ss_p_x_OJS)
summary_ss_p_x_OJS_T_selected = summary_ss_p_x_OJS_T.filter((d) =>
  selectInd_ss.includes(d.ind)
)

Black dots/line is estimated probability of being alive and orange dots are encountered yes (y = 0.8)/no (y = 0). The green line is the first observation and the red line is the last possible observation. The number in the upper right corner of each panel is the fish’s cohort.

Code
Plot.plot({
  width: width,
  height: 350,
  inset: 10,
  color: {
    scheme: "greys"
  },
  x: { label: "Age/season combination" },
  y: { label: "Probability of alive" },
  marks: [
    Plot.frame(),
    Plot.dot(summary_ss_z_OJS_T_selected, {
      x: "t",
      y: "pSurv"
    }),
    Plot.dot(summary_ss_z_OJS_T_selected, {
      x: "t",
      y: "enc8",
      fill: "orange"
    }),
    Plot.line(summary_ss_z_OJS_T_selected, {
      x: "t",
      y: "pSurv"
    }),
    Plot.ruleX(summary_ss_z_OJS_T_selected, {
      x: "first",
      y: 1,
      stroke: "green"
    }),
    Plot.ruleX(summary_ss_z_OJS_T_selected, {
      x: "last",
      y: 1,
      stroke: "red"
    })
    ,
    Plot.text(summary_ss_z_OJS_T_selected,
      Plot.selectFirst({
        x: 11,
        y: 1,
        text: d => d.cohort
      })
    )
  ],
  facet: {
    data: summary_ss_z_OJS_T_selected,
    x: "ind"
  }
})

19.2.10 Compare survival with ML survival estimates

ML estimates are in orange

Code
Plot.plot({
  width: width,
  height: 350,
  inset: 10,
  color: {
    scheme: "greys"
  },
  x: { label: "Age/season combination" },
  y: { label: "Probability of survival" },
  marks: [
    Plot.frame(),
    Plot.dot(summary_ss_phi_x_OJS_T_selected, {
      x: "t",
      y: "mean"
    }),
    Plot.dot(summary_ss_phi_x_OJS_T_selected, {
      x: "t",
      y: "enc8"
    }),
    Plot.line(summary_ss_phi_x_OJS_T_selected, {
      x: "t",
      y: "mean"
    }),
    
    Plot.dot(summary_ss_phi_x_OJS_T_selected, {
      x: "t",
      y: "xPhi",
      stroke: "orange"
    }),
    Plot.line(summary_ss_phi_x_OJS_T_selected, {
      x: "t",
      y: "xPhi",
      stroke: "orange"
    }),
    
    Plot.ruleX(summary_ss_phi_x_OJS_T_selected, {
      x: "first",
      y: 1,
      stroke: "green"
    }),
    Plot.ruleX(summary_ss_phi_x_OJS_T_selected, {
      x: "last",
      y: 1,
      stroke: "red"
    })
    ,
    Plot.text(summary_ss_phi_x_OJS_T_selected,
      Plot.selectFirst({
        x: 11,
        y: 1,
        text: d => d.cohort
      })
    )
  ],
  facet: {
    data: summary_ss_phi_x_OJS_T_selected,
    x: "ind"
  }
})

19.2.11 Compare probability of capture with ML survival estimates

ML estimates are in orange

Code
Plot.plot({
  width: width,
  height: 350,
  inset: 10,
  color: {
    scheme: "greys"
  },
  x: { label: "Age/season combination" },
  y: { label: "Probability of capture" },
  marks: [
    Plot.frame(),
    Plot.dot(summary_ss_p_x_OJS_T_selected, {
      x: "t",
      y: "mean"
    }),
    Plot.dot(summary_ss_p_x_OJS_T_selected, {
      x: "t",
      y: "enc8"
    }),
    Plot.line(summary_ss_p_x_OJS_T_selected, {
      x: "t",
      y: "mean"
    }),
    
    Plot.dot(summary_ss_p_x_OJS_T_selected, {
      x: "t",
      y: "xP",
      stroke: "orange"
    }),
    Plot.line(summary_ss_p_x_OJS_T_selected, {
      x: "t",
      y: "xP",
      stroke: "orange"
    }),
    
    Plot.ruleX(summary_ss_p_x_OJS_T_selected, {
      x: "first",
      y: 1,
      stroke: "green"
    }),
    Plot.ruleX(summary_ss_p_x_OJS_T_selected, {
      x: "last",
      y: 1,
      stroke: "red"
    })
    ,
    Plot.text(summary_ss_p_x_OJS_T_selected,
      Plot.selectFirst({
        x: 11,
        y: 1,
        text: d => d.cohort
      })
    )
  ],
  facet: {
    data: summary_ss_p_x_OJS_T_selected,
    x: "ind"
  }
})

19.2.12 Output model summary data for ML model

Code
  write.csv(summary_ss, './models/cmrNN_OB/ss/dataOut/xiaowei/summary_ss.csv')

  write.csv(summary_ss_z, './models/cmrNN_OB/ss/dataOut/xiaowei/summary_ss_z.csv')

  # #Output input data to Xiaowei directory. Turn to TRUE to output.
  # Output happens here: C:/Users/bletcher/OneDrive - DOI/projects/wbBook_quarto_targets/modelsCMR_NN_OB_outputData.qmd
  # if(FALSE) {
  #
  #   for (i in seq_along(eh)){
  #     write.csv(eh[[i]], file = paste0('./models/cmrNN_OB/tt/dataOut/xiaowei/',
  #                                      names(eh)[i],
  #                                      ".csv"),
  #               row.names = F)
  #   }
  # }